--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
meshchatx/src/backend/telephone_manager.py v3.2.0 (c5deab07) Text, 3.93 KB
Tff7b72import T7ee787asyncio
Tff7b72import T7ee787time
Tff7b72import T7ee787RNS
Tff7b72from T7ee787LXST Tff7b72import Te6edf3Telephone
Tff7b72class T56d364TelephoneManagerTb4b4b4:
T8b949e# LXST Status Constants for reference:
T8b949e# 0: STATUS_BUSY
T8b949e# 1: STATUS_REJECTED
T8b949e# 2: STATUS_CALLING
T8b949e# 3: STATUS_AVAILABLE
T8b949e# 4: STATUS_RINGING
T8b949e# 5: STATUS_CONNECTING
T8b949e# 6: STATUS_ESTABLISHED
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identityTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4, Te6edf3config_managerTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8ffconfig_manager Tff7b72= Te6edf3config_manager
Tff7b72selfTff7b72.Td2a8fftelephone Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffon_ringing_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffon_established_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffon_ended_callback Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcall_start_time Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcall_status_at_end Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcall_is_incoming Tff7b72= Tff7b72False
Tff7b72def Td2a8ffinit_telephoneTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftelephone Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8fftelephone Tff7b72= Te6edf3TelephoneTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4)
T8b949e# Disable busy tone played on caller side when remote side rejects, or doesn't answer
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_busy_tone_timeTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_ringing_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffon_telephone_ringingTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffon_telephone_call_establishedTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffset_ended_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffon_telephone_call_endedTb4b4b4)
Tff7b72def Td2a8ffteardownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftelephone Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftelephone Tff7b72= Tff7b72None
Tff7b72def Td2a8ffregister_ringing_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_ringing_callback Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffregister_established_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_established_callback Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffregister_ended_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_ended_callback Tff7b72= Te6edf3callback
Tff7b72def Td2a8ffon_telephone_ringingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3caller_identityTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcall_start_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcall_is_incoming Tff7b72= Tff7b72True
Tff7b72if Tff7b72selfTff7b72.Td2a8ffon_ringing_callbackTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_ringing_callbackTb4b4b4(Te6edf3caller_identityTb4b4b4)
Tff7b72def Td2a8ffon_telephone_call_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3caller_identityTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4)Tb4b4b4:
T8b949e# Update start time to when it was actually established for duration calculation
Tff7b72selfTff7b72.Td2a8ffcall_start_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffon_established_callbackTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_established_callbackTb4b4b4(Te6edf3caller_identityTb4b4b4)
Tff7b72def Td2a8ffon_telephone_call_endedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3caller_identityTb4b4b4: Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4)Tb4b4b4:
T8b949e# Capture status just before ending if possible, or use the last known status
Tff7b72if Tff7b72selfTff7b72.Td2a8fftelephoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcall_status_at_end Tff7b72= Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcall_status
Tff7b72if Tff7b72selfTff7b72.Td2a8ffon_ended_callbackTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffon_ended_callbackTb4b4b4(Te6edf3caller_identityTb4b4b4)
Tff7b72def Td2a8ffannounceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3attached_interfaceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftelephoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffannounceTb4b4b4(Te6edf3attached_interfaceTff7b72=Te6edf3attached_interfaceTb4b4b4)
Tff7b72async Tff7b72def Td2a8ffinitiateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destination_hashTb4b4b4: Tffa657bytesTb4b4b4, Te6edf3timeout_secondsTb4b4b4: Tffa657int Tff7b72= T79c0ff15Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fftelephone Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffTelephone is not initializedTa5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)
T8b949e# Find destination identity
Te6edf3destination_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3destination_identity Tff7b72is Tff7b72NoneTb4b4b4:
T8b949e# If not found by identity hash, try as destination hash
Te6edf3destination_identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(
Te6edf3destination_hashTb4b4b4,
Tb4b4b4) T8b949e# Identity.recall takes identity hash
Tff7b72if Te6edf3destination_identity Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffDestination identity not foundTa5d6ff"
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Te6edf3msgTb4b4b4)
T8b949e# In LXST, we just call the identity. Telephone class handles path requests.
T8b949e# But we might want to ensure a path exists first for better UX,
T8b949e# similar to how the old MeshChat did it.
T8b949e# For now, let's just use the telephone.call method which is threaded.
T8b949e# We need to run it in a thread since it might block.
Tff7b72selfTff7b72.Td2a8ffcall_start_time Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcall_is_incoming Tff7b72= Tff7b72False
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffto_threadTb4b4b4(Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffcallTb4b4b4, Te6edf3destination_identityTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8fftelephoneTff7b72.Td2a8ffactive_call
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────